//ES6中一些对象的方法

// Object.assgin(obj1, obj2)
// 功能： 合并对象， 会修改第一个对象的内容（后面的对象有相同的键值的，覆盖，没有的不变，如果最后一个为空对象，以前一个不为空对象的为准）， 并把第一个参数返回来
// 返回值是变化后的第一个参数

// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// let obj2 = {
//     name: "ss",
//     age: 45
// }
// Object.assign(obj1, obj2)
// console.log(obj1)//{ name: 'ss', age: 45 }

// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// let obj2 = {
//     name: "ss",
//     age: 45
// }
// let obj3 = {};
// console.log(Object.assign({}, obj1, obj2)) //{ name: 'ss', age: 45 }
// console.log(Object.assign(obj3, obj1, obj2)) //{ name: 'ss', age: 45 }
// console.log(Object.assign(obj1, obj2, obj3)) //{ name: 'ss', age: 45 }


//...参数名   必须放在最后，值为剩余参数组成的数组
// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// let obj2 = {
//     name: "ss",
//     age: 45
// }

// function extend(o, ...arr) {
//     console.log(arr) //[ { name: 'lili', age: 12 }, { name: 'ss', age: 45 } ]
// }
// extend({}, obj1, obj2)
// console.log(obj1) //{ name: 'lili', age: 12 }  原对象没变化

// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// let obj2 = {
//     name: "ss",
//     age: 45
// }

// function extend(o, ...arr) {
//     arr.forEach((i) => {
//         for (let key in i) {
//             o[key] = i[key]
//         }
//     })
//     return o
// }
// console.log(extend({}, obj1, obj2)) //{ name: 'ss', age: 45 }


//可枚举的属性
// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// for (let key in obj1) {
//     console.log(key) //name  age 这些是可枚举的属性
// }
// console.log(obj1)

//上面的就是可枚举的，下面原型中的对象是不可枚举的
// {name: "lili", age: 12}
// age: 12
// name: "lili"
// __proto__: 
//     constructor: ƒ Object()
//     hasOwnProperty: ƒ hasOwnProperty()
//     isPrototypeOf: ƒ isPrototypeOf()
//     propertyIsEnumerable: ƒ propertyIsEnumerable()
//     toLocaleString: ƒ toLocaleString()
//     toString: ƒ toString()
//     valueOf: ƒ valueOf()
//     __defineGetterW__: ƒ __defineGetter__()
//     __defineSetter__: ƒ __defineSetter__()
//     __lookupGetter__: ƒ __lookupGetter__()
//     __lookupSetter__: ƒ __lookupSetter__()get 
//     __proto__: ƒ __proto__()set 
//     __proto__: ƒ __proto__()


//Object.getOwnPropertyDescriptor(对象名，对象的某个属性)   获取属性的描述对象,是一个对象的属性的相关描述
// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// console.log(Object.getOwnPropertyDescriptor(obj1)) //undefined
// console.log(Object.getOwnPropertyDescriptor(obj1, 'age'))
//{ value: 12,            //值
//  writable: true,       //是否可写
//  enumerable: true,     //是否可枚举
//  configurable: true    //是否可匹配
// }

//Object.defineProperty(对象，属性，{描述的设置})  设置属性的相关描述
// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// Object.defineProperty(obj1, 'age', {
//     value: 12, //值
//     writable: false, //是否可写
//     enumerable: true, //是否可枚举
//     configurable: true //是否可匹配
// })
// obj1.age = 15;
// obj1.name = 'ssss'
// console.log(obj1)//{ name: 'ssss', age: 12 }


//Object.keys()     所有的键组成的数组
//Object.values()   所有的值组成的数组
//Object.entries()  所有的键值组成的数组

// let obj1 = {
//     name: 'lili',
//     age: 12
// };
// console.log(Object.keys(obj1)) //[ 'name', 'age' ]
// console.log(Object.values(obj1)) //[ 'lili', 12 ]
// console.log(Object.entries(obj1)) //[ [ 'name', 'lili' ], [ 'age', 12 ] ]

//Object.is()  判断两个值是否相等  返回的是布尔值
//特殊的 == === +0 -0 NaN

// console.log(Object.is(+0, -0)) //false
// console.log(+0 == -0) //true
// console.log(+0 === -0) //true
// console.log(Object.is(NaN, NaN)) //true
// console.log(NaN == NaN) //false
// console.log(NaN === NaN) //false